﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaoYL.BoosterStation._5.工具库
{
    public class DataConverterLib
    {
         /// <summary>
         /// 万能基础数据类型转换器
         /// </summary>
         /// <typeparam name="T">目标基础数据类型</typeparam>
         /// <param name="obj">待转换数据</param>
         /// <returns>转换后的数据，类型为 T</returns>
        public static T DataConverter<T>(Object obj)
        {
            try
            {
                // 如果传入对象是 null 或 DBNull，并且目标类型是 string，返回空字符串
                if ((obj == null || obj == DBNull.Value) && (typeof(T) == typeof(string)))
                {
                    return (T)Convert.ChangeType("", typeof(T));
                }

                // 如果传入对象已经是目标类型，直接返回
                if (obj is T)
                {
                    return (T)obj;
                }

                // 处理 Nullable<T> 类型
                if (typeof(T).IsGenericType)
                {
                    Type genericTypeDefinition = typeof(T).GetGenericTypeDefinition();
                    if (genericTypeDefinition == typeof(Nullable<>))
                    {
                        return (T)Convert.ChangeType(obj, Nullable.GetUnderlyingType(typeof(T)));
                    }
                }

                // 进行类型转换
                return (T)Convert.ChangeType(obj, typeof(T));
            }
            catch (InvalidCastException ex)
            {
                // 如果发生转换异常，尝试返回原对象的强制转换
                return (T)obj;
            }
            catch (Exception ex)
            {
                // 其他异常直抛
                throw;
            }

            // 返回目标类型的默认值
            return default(T);
        }

    }
}
